shell 之rm 命令的替换方案 | 您所在的位置:网站首页 › linux 替代rm › shell 之rm 命令的替换方案 |
在日常工作中经常避免要删除一些暂时不需要的文件,但由于内心着急、操作太快导致把线上的文重要件给删了,会给公司照成一些不必要的损失(最主要的是今年的年终奖又没了!!) 由于最近这个问题又在身边发生了;接下来我描述下事情发生过程: 周五临近下班前,问小弟今天的数据恢复有没有做(例行检查备份数据是否有异常)。经我这么一问他才想起工作没有做…… 存放备份的目录是/back ,他把备份的文件解压到/back目录下,并且解压出来的目录也叫back ,最终备份的数据应该在/back/back/备份数据,为了确保解压的数据没有污染,需要吧/back/back目录删掉。 他计划是这样操作的:为了防止误操作,先进到/back目录中,然后执行命令: # rm -rf back就可以了,但是他习惯从根目录找,而且还把上级目录名当成当前目录下的目录名,结果把命令写成: # rm -rf /back ,导致/back下的其他的数据也被删掉了……可能是由于忙于下班,执行删除操作没有仔细确认命令导致数据丢失。不过最后庆幸的是把数据恢复回来了!(数据陈可贵,操作需谨慎!) 由于已经发生过2次与删除事件,为了防止该类事件再次发生,开始本打算在网上找一下有没有现成的,最后发现功能都很简单,故这周末在家花了一天时间写了一个替换rm的命令(原rm命令也可以用,需要指定绝对路径:/bin/rm) 以下为rm命令的代码,请在测试环境测试完再放到线上使用!如发生后果请自负! #!/bin/bash ### 重定义rm命令 ### # 定义回收站目录#trash_path=\~/.trash#confidir="~/tmp"STAMP=`date +%Y%m%d%H%M%S` # 判断 $trash_path 定义的文件是否存在,如果不存在,那么就创建 $trash_path.if [ ! -d ~/.trash ]; then mkdir -p ~/.trash fi if [ ! -d ~/tmp ]; then mkdir -p ~/tmpfi# 使用 rl 就调用 'ls ~/.trash' # 如果更改上面的回收站目录这里的目录也需要修改 #用法提示usage() { echo "Usage:" echo " rm {-d delele } {-c all } {-l } {-s [ all | file ] }" echo "Description:" echo " -d delete, 删除目录或目录." echo " -c clean, 清空回收站或永久删除某个文件." echo " -l list, 列出已删除的文件" echo " -s save, 恢复单个或所以已删除文件." echo "注意!不支持这样的写法: /aa/bb/cc/{a,b,c}" echo "注意!支持这样的写法: /aa/bb/cc/a /aa/bb/cc/b /aa/bb/cc/c" exit -1} list() { echo "以下为回收站的文件" ls ~/.trash} save() { echo "如果有重复的文件请指定文件名并恢复" read -p "确定要恢复所有文件到~/tmp下吗?[y/n y] " confirm for i in `ls ~/.trash/`;do mv -i ~/.trash/$i ~/tmp/${i%.*} done exit -1} clean() { read -p "回收站会保留一个月,确定要清空回收站的文件吗?[y/n n]" confirm [ $confirm == y ] || [ $confirm == Y ] || [ $confirm == yes ] && /bin/rm -rf ~/.trash/* exit -1 } # 获取脚本执行时的选项while getopts :d:c:s:l option do case "${option}" in d) # 删除文件的函数 read -p "如果文件很大删除需要一些时间,请不要终止操作,否则恢复的文件将无法使用!![y/n y]" conf if [[ "$conf" == "y" ]] || [[ "$conf" = "Y" ]] || [[ "$conf" = "yes" ]] || [ ! $conf ];then shift nameall=$(echo $@) read -p "$nameall 您确定要删除这个文件或目录吗?[y/n n] " confisv for i in $@;do #name=`echo $(basename $i)` name=$(echo $i| awk -F/ '{print $NF}') #[[ $confisv = "y" ]] || [[ $confisv = "Y" ]] || [[ $confisv = "yes" ]] && mv ${OPTARG} ~/.trash/${OPTARG}.$STAMP [[ $confisv = "y" ]] || [[ $confisv = "Y" ]] || [[ $confisv = "yes" ]] && mv $i ~/.trash/$name\.$STAMP done exit -1 else break exit -1 fi ;; c) list if [[ ${OPTARG} -eq "all" ]];then clean else read -p "确定要删除回收站的这个 ${OPTARG} 文件吗?[y/n n]" confirm [[ $confirm == "y" ]] || [[ $confirm == "Y" ]] || [[ $confirm == "yes" ]] && /bin/rm -rf ~/.trash/${OPTARG} exit -1 fi ;; l) list exit -1 ;; s) list if [[ ${OPTARG} -eq "all" ]];then save else read -p "确定要恢复这个${OPTARG}文件到~/tmp下吗?[y/n y]" confism [[ $confism == "y" ]] || [[ $confism == "Y" ]] || [[ $confism == "yes" ]] && mv ~/.trash/${OPTARG} ~/tmp/$(echo ${OPTARG}|awk -F. '{print $NR }') exit -1 fi ;; ?) echo "Invalid option: -$OPTARG" >&2 usage;; :) usage;; *) usage;; esac echo $option ,$OPTARGdone |
CopyRight 2018-2019 实验室设备网 版权所有 |